package ar.edu.utn.frsf.tpae.a2012.g05.service.impl;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import ar.edu.utn.frsf.tpae.a2012.g05.dao.ClienteDao;
import ar.edu.utn.frsf.tpae.a2012.g05.dao.CuentaDao;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cliente;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.CuentaCorriente;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.NegocioException;
import ar.edu.utn.frsf.tpae.a2012.g05.service.CuentaService;

@Service
public class CuentaServiceImpl implements CuentaService {

	@Autowired @Qualifier("cuentaDaoImpl")
	private CuentaDao cuentaDao;
	
	@Autowired @Qualifier("clienteDaoImpl")
	private ClienteDao clienteDao;

	public List<Cuenta> findCuentasCliente(Integer idCliente) 
			throws NegocioException {
		
		try {
			Cliente cliente = clienteDao.findById(idCliente);
			if (cliente == null)
				throw new Exception();
		} catch (Exception e) {
			throw new NegocioException("El cliente no existe");
		}
		
		return cuentaDao.findCuentasCliente(idCliente);
	}

	public void debitar(Cuenta cuenta, BigDecimal monto) throws NegocioException {

		BigDecimal minimo = new BigDecimal(0);
		
		if(cuenta instanceof CuentaCorriente) {
			BigDecimal limiteNegativo = new BigDecimal(((CuentaCorriente) cuenta).getLimiteSaldoNegativo());
			minimo = minimo.subtract(limiteNegativo);
		} 
		if (cuenta.getSaldoActual().subtract(monto).compareTo(minimo) >= 0) {
			cuentaDao.debitar(cuenta, monto);
		} else {
			throw new NegocioException("La cuenta no tiene saldo suficiente para realizar el pago."
							+ "Saldo: " + cuenta.getSaldoActual() + " - Pago: " + monto + " - Minimo: " + minimo);
		}
	}
	
	public Cuenta findCuentaById(Integer idCuenta) {
		return cuentaDao.findById(idCuenta);
	}

	public void setCuentaDao(CuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}

	public void setClienteDao(ClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}
	
	
}
